﻿using System;
//有了泛化委托，我们就可以写非常泛化的小型委托类，它们可以为具有任意返回类型和任意多参数的方法服务。它们是Func和Action委托，在System命名空间中定义（in和out用来标志变量）
delegate TResult Func<out TResult>();
delegate TResult Func<in T, out TResult>(T arg);
delegate TResult Func<in T1, in T2, out TResult>(T1 arg1, T2 arg2);
//……以此类推，最多到T16
delegate void Action();
delegate void Action<in T>(T arg);
delegate void Action<in T1, in T2>(T1 arg1, T2 arg2);
//……以此类推，最多到T16

namespace _085_Func和Action委托
{
    class Program
    {
        // 这些委托都完全泛化，前面举例的Transformer委托，可以用一个带T类型参数并返回T类型值的Func委托代替：
        public static void Transform<T>(T[] values, Func<T, T> transformer)
        {
            for (int i = 0; i < values.Length; i++)
            {
                values[i] = transformer(values[i]);
            }
        }
        // 只有ref/out和指针参数在这些委托中没有涉及到。
        static void Main(string[] args)
        {
        }
    }
}
